package logica.DAO;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import objetosNegocio.Familia;
import objetosNegocio.ListaFamilias;

public class DAOFamilia implements InterfazDAOFamilia{

	private DAOConnection connection; //Conexion a BBDD
	
	/**
	 * @param connection - Objeto que encapsula la conexion a la bbdd
	 */
	public DAOFamilia(DAOConnection connection){
		this.connection = connection;
	}
	
	
	@Override
	public boolean insertarRegistro(Familia datos) throws SQLException {
		boolean insertado = false;
		Statement stmt = null;
				
		String sentenciaSQL = "";  		//Siempre se inserta el registro como activo (valor 0)
		sentenciaSQL =	"INSERT INTO gesal.Familia (idFamilia,categoria,subcategoria,activo) VALUES (";
		sentenciaSQL+= "NULL," + "\"" + datos.getCategoria() +  "\",\"" + datos.getSubcategoria() + "\",0)"; 
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) insertado=true;
		stmt.close();
		
		return insertado;
	}

	
	@Override
	public boolean modificarRegistro(Familia datos) throws SQLException {
		boolean modificado = false;
		Statement stmt = null;
		
		int activo = datos.getActivo()? 0 : 1; //Pasamos de boolean a int
		
		String sentenciaSQL = "";
		sentenciaSQL = "UPDATE gesal.Familia SET";
		sentenciaSQL+= " categoria=\"" + datos.getCategoria() + "\",";
		sentenciaSQL+= " subcategoria=\"" + datos.getSubcategoria() + "\",";
		sentenciaSQL+= " activo=\"" + activo + "\"";
		sentenciaSQL+= " WHERE idFamilia=" + datos.getIdFamilia();
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) modificado=true;
		stmt.close();
		
		return modificado;
	}

	@Override
	public boolean bajaRegistro(int codigo) throws SQLException {
		boolean baja = false;
		Statement stmt = null;
		
		String sentenciaSQL = "";
		sentenciaSQL = "UPDATE gesal.Familia SET activo=1 WHERE idFamilia=" + codigo;
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) baja=true;
		stmt.close();

		return baja;
	}

	
	@Override
	public Familia obtenerRegistro(int codigo) throws SQLException {
		ResultSet resul = null;
		Statement stmt = null;
		Familia datos = null;
		
		String sentenciaSQL = "";
		sentenciaSQL = "SELECT idFamilia,categoria,subcategoria,activo";
		sentenciaSQL+= " FROM gesal.Familia WHERE idFamilia=" + codigo;
		
		stmt = connection.getConnection().createStatement();
		resul = stmt.executeQuery(sentenciaSQL);
		
		//Si se encuentra el registro se tratan los datos
		if (resul.next()){  
			datos= new Familia();	
			datos.setIdFamilia(resul.getInt("idFamilia"));
			datos.setCategoria(resul.getString("categoria"));
			datos.setSubcategoria(resul.getString("subcategoria"));
			datos.setActivo((resul.getInt("activo")==0));
		}
		
		resul.close();
		stmt.close();
	
		return datos;
	}


	@Override
	public ListaFamilias obtenerListaRegistros() throws SQLException {
		return obtenerListado(false);
	}
	
	
	@Override
	public ListaFamilias obtenerListaRegistrosActivos() throws SQLException {
		return obtenerListado(true);
	}
	
	
	private ListaFamilias obtenerListado(boolean soloActivos) throws SQLException {
		ResultSet resul = null;
		Statement stmt = null;
		
		Familia datos = null;
		ListaFamilias listado = new ListaFamilias();
		
		String sentenciaSQL = "";
		sentenciaSQL = "SELECT idFamilia,categoria,subcategoria,activo FROM gesal.Familia";
		
		if (soloActivos)
			sentenciaSQL+= " WHERE activo=0";
		
		stmt = connection.getConnection().createStatement();
		resul = stmt.executeQuery(sentenciaSQL);
		
		//Si se encuentra el registro se tratan los datos
		while (resul.next()){  
			datos= new Familia();	
			datos.setIdFamilia(resul.getInt("idFamilia"));
			datos.setCategoria(resul.getString("categoria"));
			datos.setSubcategoria(resul.getString("subcategoria"));
			datos.setActivo((resul.getInt("activo")==0));
			listado.add(datos);
		}
		
		resul.close();
		stmt.close();
		return listado;
	}

}
